
package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Wilson
 */

/*********************************************************************** /
    <declaracaoMetodoVoid> ::= void <nome> ( (<parametros>|E) ){<cmd>}
/************************************************************************/

public class declaracaoMetodosVoid {

    cmd cmd = new cmd();
    parametros parametros = new parametros();

    public boolean declaracaoMetodosVoid(TabelaSimbolos tabelaSimbolos) {

        if(tabelaSimbolos.reconhecer("void"))
        {
            if(tabelaSimbolos.getTipo().equals("identificador"))
            {
                // salva o nome do escopo
                tabelaSimbolos.salvaEscopo(tabelaSimbolos.getLookahead());
                tabelaSimbolos.insertCategoria("metodo");

                tabelaSimbolos.reconhecer(tabelaSimbolos.getLookahead());
                if(tabelaSimbolos.reconhecer("("))
                {
                    System.out.println(tabelaSimbolos.getLookahead());

                    if(this.isChamadaFuncao(tabelaSimbolos)){
                        if(parametros.sintaxeParametros(tabelaSimbolos)){

                        }else
                            return false;
                    }
                    if(tabelaSimbolos.reconhecer(")")){

                            if(tabelaSimbolos.reconhecer("{"))
                            {
                                while(!tabelaSimbolos.getLookahead().equals("}")){
                                if(!cmd.sintaxeCmd(tabelaSimbolos)){
                                    return false;
                                    }
                                }

                                if(tabelaSimbolos.reconhecer("}"))
                                {
                                    return true;
                                }
                                else{
                             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                          return false;//depois do identificador, não veio nem ; nem (
                        }
                            }
                            else{
                             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                          return false;//depois do identificador, não veio nem ; nem (
                        }
                        }
                        else{
                             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                          return false;//depois do identificador, não veio nem ; nem (
                        }
                    }
                    else{
                             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                          return false;//depois do identificador, não veio nem ; nem (
                        }
                }
                else{
                             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                          return false;//depois do identificador, não veio nem ; nem (
                        }
            }
            else{
                             ErroTabela erro = new ErroTabela(tabelaSimbolos.getLinha(), "Erro na linha " + tabelaSimbolos.getLinha());
                                                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                                          return false;//depois do identificador, não veio nem ; nem (
                        }
        }

    public boolean isChamadaFuncao(TabelaSimbolos tabela){
        if(tabela.getTipo().equals("identificador") || tabela.getTipo().equals("palavra"))
            return true;
        else
            return false;
    }
}

